<?php

require_once 'Utilisateur.php';
require_once 'Role.php';
require_once CHEMIN_MODELE . 'Etablissement.php';
require_once CHEMIN_MODELE . 'MailManager.php';
require_once CHEMIN_MODELE . 'TelephoneManager.php';

/**
 * Description of UtilisateurManager
 *
 * @author yahn
 */
class UtilisateurManager {

    public static function VerifConnexion($login, $password) {
        try {

            $pdo = PDO2::getInstance();


            $requete = $pdo->prepare("SELECT login FROM Utilisateur
		WHERE
		login = :nom_utilisateur AND 
		mdp = :mot_de_passe
                and hash_validation=''");

            $requete->bindValue(':nom_utilisateur', $login);
            $requete->bindValue(':mot_de_passe', $password);
            $requete->execute();

            if ($result = $requete->fetch(PDO::FETCH_ASSOC)) {

                $requete->closeCursor();
                return $result['login'];
            }
            return false;
        } catch (PDOException $e) {
            echo '<p>Erreur : ' . $e->getMessage() . '</p>';
            $rtrn = null;
        }
        return $rtrn;
    }

    public static function add(Utilisateur $user, $hash) {

        $pdo = PDO2::getInstance();
        $pdo->beginTransaction();


        $q = $pdo->prepare('INSERT INTO Utilisateur VALUES (:login,:mdp, :nom, :prenom, :hash);');
        $q->bindValue(':login', $user->getLogin());
        $q->bindValue(':mdp', $user->getPassword());
        $q->bindValue(':nom', $user->getNom());
        $q->bindValue(':prenom', $user->getPrenom());
        $q->bindValue(':hash', $hash);
        if (!$q->execute()) {
            $pdo->rollback();
            return $q->errorInfo();
        }



        //une fois l'insertion de l'utilisateur effectuée on ajoute son établissement...
        $r = $pdo->prepare('INSERT INTO AssociationEtablissement VALUES (:nomEts, :login);');
        //Actuellement, l'utilisateur ne peut être affecté qu'à un seul établissement.
        $r->bindValue(':nomEts', $user->getLesEtablissements(0)->getNom());
        $r->bindValue(':login', $user->getLogin());
        if (!$r->execute()) {
            $pdo->rollback();
            return $r->errorInfo();
        }



        //...son role
        $q = $pdo->prepare('INSERT INTO AssociationRole VALUES (:idRole, :login);');
//Actuellement, l'utilisateur ne peut avoir qu'un role.
        $q->bindValue(':idRole', $user->getLesRoles(0)->getNumero());
        $q->bindValue(':login', $user->getLogin());
        if (!$q->execute()) {
            $pdo->rollback();
            return $q->errorInfo();
        }

        // ses mails
        foreach ($user->getLesMails() as $mail) {
            $requete = $pdo->prepare("INSERT INTO Mail VALUES(:mail,:login,:type);");
            $requete->bindValue(':mail', $mail->getMail());
            $requete->bindValue(':type', $mail->getType());
            $requete->bindValue(':login', $user->getLogin());
            if (!$requete->execute()) {
                $pdo->rollback();
                return $requete->errorInfo();
            }
        }

        $pdo->commit();
        return $pdo->lastInsertId();
    }

    public static function update(Utilisateur $user) {
        try {
            $pdo = PDO2::getInstance();
            $pdo->beginTransaction();

            $mdp = $user->getPassword();
            $nom = $user->getNom();
            $prenom = $user->getPrenom();
            $login = $user->getLogin();
            $requet = $pdo->exec("UPDATE Utilisateur SET nom ='" . $nom . "', prenom ='" . $prenom . "' WHERE login ='" . $login . "';");
            if ($requet < 1) {
                $pdo->rollback();
                return $requet->errorInfo();
            }


            //mise à jour des établissements
            foreach ($user->getLesEtablissements() as $ets) {
                $requete = $pdo->exec("UPDATE AssociationEtablissement SET nom ='" . $ets->getNom() . "' WHERE login ='" . $login . "';");
                if ($requete < 1) {
                    $pdo->rollback();
                    return $requete->errorInfo();
                }
            }


            //mise à jour des roles
            foreach ($user->getLesRoles() as $role) {
                $r = $pdo->exec("UPDATE AssociationRole SET id =" . $role->getNumero() . " WHERE login ='" . $user->getLogin() . "';");
                if ($r < 1) {
                    $pdo->rollback();
                    return $r->errorInfo();
                }
            }

            //mise à jour des mails
            $req = $pdo->exec("DELETE FROM Mail WHERE login ='" . $login . "';");
            if ($req < 1) {
                $pdo->rollback();
                return $req->errorInfo();
            }
            foreach ($user->getLesMails() as $mail) {
                $mel = $mail->getMail();
                $type = $mail->getType();
                $req = $pdo->exec("INSERT INTO Mail VALUES('" . $mel . "','" . $login . "','" . $type . "');");

                if ($req < 1) {
                    $pdo->rollback();
                    return $req->errorInfo();
                }
            }
            return $pdo->commit();
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    public static function updatePassword($login, $mdp) {
        $pdo = PDO2::getInstance();
        $pdo->beginTransaction();
        try {
            $requete = $pdo->exec("UPDATE Utilisateur SET mdp='" . $mdp . "' WHERE login = '" . $login . "';");
            if ($requete == 1) {
                $pdo->commit();
                return $requete;
            }
        } catch (PDOException $ex) {
            $pdo->rollback();
            echo $ex->getMessage();
        }
    }

    public static function delete(Utilisateur $user) {
        try {
            $pdo = PDO2::getInstance();
            $q = $pdo->prepare('DELETE FROM Utilisateur WHERE login = :login');
            $q->bindValue(':login', $user->getLogin());
            $q->execute();
        } catch (PDOException $e) {
            echo '<p>Erreur lors de la suppresion : ' . $e->getMessage() . '</p>';
        }
    }

    public static function getUtilisateur($id_utilisateur) {
        $pdo = PDO2::getInstance();

        $requete = $pdo->prepare("SELECT u.login, mdp, nom, prenom, r.id, r.profil
                                  FROM Utilisateur u, AssociationRole a, Role r
                                  WHERE a.login = u.login
                                  AND a.id = r.id
                                  AND u.login =  :login", array(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL));

        $requete->bindValue(':login', $id_utilisateur);
        $requete->execute();

        $donnees = $requete->fetch(PDO::FETCH_OBJ);
//Création de l'utilisateur avec les informations de la BD
        $utilisateur = new Utilisateur($donnees->login, $donnees->mdp, $donnees->nom, $donnees->prenom);
//Création du premier role
        $firstRole = new Role($donnees->id, $donnees->profil);
        while ($donnees = $requete->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_FIRST)) {
            $utilisateur->addUnRole(new Role($donnees->id, $donnees->profil));
        }
        $utilisateur->addUnRole($firstRole);
        foreach (MailManager::getLesMails($id_utilisateur) as $mail) {
            $utilisateur->addUnMail($mail);
        }
        foreach (TelephoneManager::getLesTelephone($id_utilisateur) as $tel) {
            $utilisateur->addUnTel($tel);
        }
        //$utilisateur->addUnMail($mail);
        $requete->closeCursor();
        return $utilisateur;
        return false;
    }

    public static function getRolesUser($login) {
        try {

            $pdo = PDO2::getInstance();


            $requete = $pdo->prepare("SELECT profil FROM AssociationRole a, Role r
		WHERE a.id = r.id and
		login = :nom_utilisateur");

            $requete->bindValue(':nom_utilisateur', $login);

            $requete->execute();
            $result = array();
            while ($donnees = $requete->fetch(PDO::FETCH_ASSOC)) {

                $result[] = $donnees['profil'];
            }
            $requete->closeCursor();
            return $result;
        } catch (PDOException $e) {
            echo '<p>Erreur : ' . $e->getMessage() . '</p>';
            $rtrn = null;
        }
    }

    public static function getEtablissementsUser($login) {
        try {

            $pdo = PDO2::getInstance();


            $requete = $pdo->prepare("SELECT * FROM AssociationEtablissement a, Etablissement e
		WHERE a.nom = e.nom and
		login = :nom_utilisateur");

            $requete->bindValue(':nom_utilisateur', $login);

            $requete->execute();
            $result = array();
            while ($donnees = $requete->fetch(PDO::FETCH_OBJ)) {
                $ets = new Etablissement($donnees->nom, $donnees->adr, $donnees->tel, $donnees->mail, $donnees->siteweb);
                $result[] = $ets;
            }
            $requete->closeCursor();
            return $result;
        } catch (PDOException $e) {
            echo '<p>Erreur : ' . $e->getMessage() . '</p>';
            $rtrn = null;
        }
    }

    public static function valider_compte_avec_hash($hash_validation) {
        $pdo = PDO2::getInstance();

        $requete = $pdo->prepare("UPDATE Utilisateur SET
		hash_validation = ''
		WHERE
		hash_validation = :hash_validation");

        $requete->bindValue(':hash_validation', $hash_validation);

        $requete->execute();

        return ($requete->rowCount() == 1);
    }

    public static function generer_mot_de_passe($nb_caractere = 12) {
        $mot_de_passe = "";

        $chaine = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $longeur_chaine = strlen($chaine);

        for ($i = 1; $i <= $nb_caractere; $i++) {
            $place_aleatoire = mt_rand(0, ($longeur_chaine - 1));
            $mot_de_passe .= $chaine[$place_aleatoire];
        }

        return $mot_de_passe;
    }

}

?>
